package proyecto.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;

import javax.sql.DataSource;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.dao.DataAccessException;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;

import proyecto.excepcion.DAOExcepcion;
import proyecto.modelo.Categoria;


// ctrl  +shit+c
//public class CategoriaDAOImpl extends BaseDAO implements CategoriaDAO {
//
//	private DataSource dataSource;
//
//	public void setDataSource(DataSource dataSource) {
//		this.dataSource = dataSource;
//	}
//
//	public Collection<Categoria> buscarPorNombre(String nombre)
//			throws DAOExcepcion {
//		String query = "select id_categoria, nombre, descripcion from categoria where nombre like ?";
//		Collection<Categoria> lista = new ArrayList<Categoria>();
//		Connection con = null;
//		PreparedStatement stmt = null;
//		ResultSet rs = null;
//		try {
//			con = dataSource.getConnection();
//			stmt = con.prepareStatement(query);
//			stmt.setString(1, "%" + nombre + "%");
//			rs = stmt.executeQuery();
//			while (rs.next()) {
//				Categoria vo = new Categoria();
//				vo.setIdCategoria(rs.getInt("id_categoria"));
//				vo.setNombre(rs.getString("nombre"));
//				vo.setDescripcion(rs.getString("descripcion"));
//				lista.add(vo);
//			}
//		} catch (SQLException e) {
//			System.err.println(e.getMessage());
//			throw new DAOExcepcion(e.getMessage());
//		} finally {
//			this.cerrarResultSet(rs);
//			this.cerrarStatement(stmt);
//			this.cerrarConexion(con);
//		}
//		System.out.println(lista.size());
//		return lista;
//	}
//
//	public Categoria insertar(Categoria vo) throws DAOExcepcion {
//		String query = "INSERT INTO categoria(nombre,descripcion) VALUES (?,?)";
//		Connection con = null;
//		PreparedStatement stmt = null;
//		ResultSet rs = null;
//		//resultSet  es el record
//		try {
//			con = dataSource.getConnection();
//			stmt = con.prepareStatement(query);
//			stmt.setString(1, vo.getNombre());
//			stmt.setString(2, vo.getDescripcion());
//			int i = stmt.executeUpdate();
//			if (i != 1) {
//				throw new SQLException("No se pudo insertar");
//			} // Obtener el ultimo id 
//			query = "SELECT LAST_INSERT_ID()";
//			stmt = con.prepareStatement(query);
//			rs = stmt.executeQuery(); //entrega un resultSet
//			if (rs.next()) {
//				vo.setIdCategoria(rs.getInt(1));
//			}
//
//		} catch (SQLException e) {
//			System.err.println(e.getMessage());
//			throw new DAOExcepcion(e.getMessage());
//		} finally {
//			this.cerrarResultSet(rs);
//			this.cerrarStatement(stmt);
//			this.cerrarConexion(con);
//		}
//		return vo;
//	}
//
//	public Categoria obtener(int idCategoria) throws DAOExcepcion {
//		Categoria vo = new Categoria();
//		Connection con = null;
//		PreparedStatement stmt = null;
//		ResultSet rs = null;
//		try {
//			String query = "select id_categoria, nombre, descripcion from categoria where id_categoria=?";
//			con = dataSource.getConnection();
//			stmt = con.prepareStatement(query);
//			stmt.setInt(1, idCategoria);
//			rs = stmt.executeQuery();
//			if (rs.next()) {
//				vo.setIdCategoria(rs.getInt("id_categoria"));
//				vo.setNombre(rs.getString("nombre"));
//				vo.setDescripcion(rs.getString("descripcion"));
//			}
//		} catch (SQLException e) {
//			System.err.println(e.getMessage());
//			throw new DAOExcepcion(e.getMessage());
//		} finally {
//			this.cerrarResultSet(rs);
//			this.cerrarStatement(stmt);
//			this.cerrarConexion(con);
//		}
//		return vo;
//	}
//
//	public void eliminar(int idCategoria) throws DAOExcepcion {
//		String query = "DELETE FROM categoria WHERE id_categoria=?";
//		Connection con = null;
//		PreparedStatement stmt = null;
//		try {
//			con = dataSource.getConnection();
//			stmt = con.prepareStatement(query);
//			stmt.setInt(1, idCategoria);
//			int i = stmt.executeUpdate();
//			if (i != 1) {
//				throw new SQLException("No se pudo eliminar");
//			}
//		} catch (SQLException e) {
//			System.err.println(e.getMessage());
//			throw new DAOExcepcion(e.getMessage());
//		} finally {
//			this.cerrarStatement(stmt);
//			this.cerrarConexion(con);
//		}
//	}
//
//	public Categoria actualizar(Categoria vo) throws DAOExcepcion {
//		String query = "update categoria set nombre=?,descripcion=? where id_categoria=?";
//		Connection con = null;
//		PreparedStatement stmt = null;
//		try {
//			con = dataSource.getConnection();
//			stmt = con.prepareStatement(query);
//			stmt.setString(1, vo.getNombre());
//			stmt.setString(2, vo.getDescripcion());
//			stmt.setInt(3, vo.getIdCategoria());
//			int i = stmt.executeUpdate();
//			if (i != 1) {
//				throw new SQLException("No se pudo actualizar");
//			}
//		} catch (SQLException e) {
//			System.err.println(e.getMessage());
//			throw new DAOExcepcion(e.getMessage());
//		} finally {
//			this.cerrarStatement(stmt);
//			this.cerrarConexion(con);
//		}
//		return vo;
//	}
//
//	public Collection<Categoria> listar() throws DAOExcepcion {
//
//		Collection<Categoria> c = new ArrayList<Categoria>();
//		Connection con = null;
//		PreparedStatement stmt = null;
//		ResultSet rs = null;
//		try {
//			con = dataSource.getConnection();
//			String query = "SELECT id_categoria,nombre,descripcion from categoria";
//			stmt = con.prepareStatement(query);
//			rs = stmt.executeQuery();
//			while (rs.next()) {
//				Categoria vo = new Categoria();
//				vo.setIdCategoria(rs.getInt("id_categoria"));
//				vo.setNombre(rs.getString("nombre"));
//				vo.setDescripcion(rs.getString("descripcion"));
//				c.add(vo);
//			}
//
//		} catch (SQLException e) {
//			System.err.println(e.getMessage());
//			throw new DAOExcepcion(e.getMessage());
//		} finally {
//			this.cerrarResultSet(rs);
//			this.cerrarStatement(stmt);
//			this.cerrarConexion(con);
//		}
//		return c;
//	}
//}

// crtl  + shift + o
//crtl +shift + f

public class CategoriaDAOImpl extends HibernateDaoSupport implements
		CategoriaDAO {

	protected Log log = LogFactory.getLog(getClass());

	private DataSource dataSource;

	public void setDataSource(DataSource dataSource) {
		this.dataSource = dataSource;
	}

	@SuppressWarnings("unchecked")
	public List<Categoria> buscarPorNombre2(String nombre) throws DAOExcepcion {

		log.info("buscarPorNombre() : " + nombre);

		List<Categoria> arreglo = new ArrayList<Categoria>();
		try {
			arreglo = getHibernateTemplate().find(
					"from Categoria a where trim(a.nombre) like ?",
					"%" + nombre + "%");
		} catch (Exception e) {
			log.error(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		}
		return arreglo;
	}

	public Collection<Categoria> buscarPorNombre(String nombre)
			throws DAOExcepcion {
		String query = "select id_categoria, nombre, descripcion from categoria where nombre like ?";
		Collection<Categoria> lista = new ArrayList<Categoria>();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			con = dataSource.getConnection();
			stmt = con.prepareStatement(query);
			stmt.setString(1, "%" + nombre + "%");
			rs = stmt.executeQuery();
			while (rs.next()) {
				Categoria vo = new Categoria();
				vo.setIdCategoria(rs.getInt("id_categoria"));
				vo.setNombre(rs.getString("nombre"));
				vo.setDescripcion(rs.getString("descripcion"));
				lista.add(vo);
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			try {
				rs.close();
				stmt.close();
				con.close();
			} catch (SQLException e) {
				throw new DAOExcepcion(e.getMessage());
			}
		}
		System.out.println(lista.size());
		return lista;
	}

	@SuppressWarnings("unchecked")
	public List<Categoria> listar() throws DAOExcepcion {
		log.info("listar()");
		List<Categoria> lista = new ArrayList<Categoria>();
		try {
			lista = getHibernateTemplate().find("from Categoria");
		} catch (DataAccessException e) {
			log.error(e.toString());
			throw new DAOExcepcion(e.getMessage());
		}
		return lista;
	}

	public Categoria obtener(int idCategoria) throws DAOExcepcion {
		log.info("obtener() : " + idCategoria);
		Categoria modelo = new Categoria();
		try {
			modelo = (Categoria) getHibernateTemplate().find(
					"from Categoria a where trim(a.idCategoria) = ?",
					idCategoria + "").get(0);
		} catch (Exception e) {
			log.error("Error: " + e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		}
		return modelo;
	}

	public Categoria actualizar(Categoria modelo) throws DAOExcepcion {
		try {
			getHibernateTemplate().update(modelo);
			getHibernateTemplate().flush();
		} catch (Exception e) {
			log.error(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		}
		return modelo;
	}

	public Categoria insertar(Categoria modelo) throws DAOExcepcion {
		try {
			getHibernateTemplate().save(modelo);
			getHibernateTemplate().flush();
		} catch (Exception e) {
			log.error(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		}
		return modelo;
	}

	public void eliminar(int idCategoria) throws DAOExcepcion {
		Categoria modelo = new Categoria();
		modelo.setIdCategoria(idCategoria);
		try {
			getHibernateTemplate().delete(modelo);
			getHibernateTemplate().flush();
		} catch (Exception e) {
			log.error(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		}
	}

}
